home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / ultqsrc.zip / WIZARD.QC < prev    next >
Text File  |  1996-10-04  |  9KB  |  315 lines

  1. /*
  2. ==============================================================================
  3.  
  4. WIZARD
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. $cd /raid/quake/id1/models/a_wizard
  10. $origin 0 0 24
  11. $base wizbase    
  12. $skin wizbase
  13.  
  14. $frame hover1 hover2 hover3 hover4 hover5 hover6 hover7 hover8
  15. $frame hover9 hover10 hover11 hover12 hover13 hover14 hover15
  16.  
  17. $frame fly1 fly2 fly3 fly4 fly5 fly6 fly7 fly8 fly9 fly10
  18. $frame fly11 fly12 fly13 fly14
  19.  
  20. $frame magatt1 magatt2 magatt3 magatt4 magatt5 magatt6 magatt7
  21. $frame magatt8 magatt9 magatt10 magatt11 magatt12 magatt13
  22.  
  23. $frame pain1 pain2 pain3 pain4
  24.  
  25. $frame death1 death2 death3 death4 death5 death6 death7 death8
  26.  
  27. /*
  28. ==============================================================================
  29.  
  30. WIZARD
  31.  
  32. If the player moves behind cover before the missile is launched, launch it
  33. at the last visible spot with no velocity leading, in hopes that the player
  34. will duck back out and catch it.
  35. ==============================================================================
  36. */
  37.  
  38. /*
  39. =============
  40. LaunchMissile
  41.  
  42. Sets the given entities velocity and angles so that it will hit self.enemy
  43. if self.enemy maintains it's current velocity
  44. 0.1 is moderately accurate, 0.0 is totally accurate
  45. =============
  46. */
  47. void(entity missile, float mspeed, float accuracy) LaunchMissile =
  48. {
  49.     local    vector    vec, move;
  50.     local    float    fly;
  51.  
  52.     makevectors (self.angles);
  53.         
  54. // set missile speed
  55.     vec = self.enemy.origin + self.enemy.mins + self.enemy.size * 0.7 - missile.origin;
  56.  
  57. // calc aproximate time for missile to reach vec
  58.     fly = vlen (vec) / mspeed;
  59.     
  60. // get the entities xy velocity
  61.     move = self.enemy.velocity;
  62.     move_z = 0;
  63.  
  64. // project the target forward in time
  65.     vec = vec + move * fly;
  66.     
  67.     vec = normalize(vec);
  68.     vec = vec + accuracy*v_up*(random()- 0.5) + accuracy*v_right*(random()- 0.5);
  69.     
  70.         missile.speed = 400;
  71.     missile.velocity = vec * mspeed;
  72.  
  73.     missile.angles = '0 0 0';
  74.     missile.angles_y = vectoyaw(missile.velocity);
  75.  
  76. // set missile duration
  77.     missile.nextthink = time + 5;
  78.     missile.think = SUB_Remove;    
  79. };
  80.  
  81. /*
  82. =================
  83. WizardAttackFinished
  84. =================
  85. */
  86. float()    WizardAttackFinished =
  87. {
  88.     if (enemy_range >= RANGE_MID || !enemy_vis)
  89.     {
  90.         self.attack_state = AS_STRAIGHT;
  91.         self.think = wiz_run1;
  92.     }
  93.     else
  94.     {
  95.         self.attack_state = AS_SLIDING;
  96.         self.think = wiz_side1;
  97.     }
  98. };
  99.  
  100. /*
  101. ==============================================================================
  102.  
  103. FAST ATTACKS
  104.  
  105. ==============================================================================
  106. */
  107. void() Wiz_FastFire =
  108. {
  109.     local vector        vec;
  110.     local vector        dst;
  111.  
  112.     if (self.owner.health > 0)
  113.     {
  114.         self.owner.effects = self.owner.effects | EF_MUZZLEFLASH;
  115.  
  116.         makevectors (self.enemy.angles);    
  117.         dst = self.enemy.origin - 13*self.movedir;
  118.     
  119.         vec = normalize(dst - self.origin);
  120.         sound (self, CHAN_WEAPON, "wizard/wattack.wav", 1, ATTN_NORM);
  121.                 launch_spike (self.origin, vec, self.owner,"wizspike",0);
  122.     }
  123.  
  124.     remove (self);
  125. };
  126.  
  127.  
  128. void() Wiz_StartFast =
  129. {
  130.     local    entity    missile;
  131.     
  132.     sound (self, CHAN_WEAPON, "wizard/wattack.wav", 1, ATTN_NORM);
  133.     self.v_angle = self.angles;
  134.     makevectors (self.angles);
  135.  
  136.     missile = spawn ();
  137.     missile.owner = self;
  138.     missile.nextthink = time + 0.6;
  139.     setsize (missile, '0 0 0', '0 0 0');        
  140.     setorigin (missile, self.origin + '0 0 30' + v_forward*14 + v_right*14);
  141.     missile.enemy = self.enemy;
  142.     missile.nextthink = time + 0.8;
  143.     missile.think = Wiz_FastFire;
  144.     missile.movedir = v_right;
  145.  
  146.     missile = spawn ();
  147.     missile.owner = self;
  148.     missile.nextthink = time + 1;
  149.     setsize (missile, '0 0 0', '0 0 0');        
  150.     setorigin (missile, self.origin + '0 0 30' + v_forward*14 + v_right* -14);
  151.     missile.enemy = self.enemy;
  152.     missile.nextthink = time + 0.3;
  153.     missile.think = Wiz_FastFire;
  154.     missile.movedir = VEC_ORIGIN - v_right;
  155. };
  156.  
  157.  
  158.  
  159. void() Wiz_idlesound =
  160. {
  161. local float wr;
  162.     wr = random() * 5;
  163.  
  164.     if (self.waitmin < time)
  165.     {
  166.          self.waitmin = time + 2;
  167.          if (wr > 4.5) 
  168.              sound (self, CHAN_VOICE, "wizard/widle1.wav", 1,  ATTN_IDLE);
  169.          if (wr < 1.5)
  170.              sound (self, CHAN_VOICE, "wizard/widle2.wav", 1, ATTN_IDLE);
  171.     }
  172.     return;
  173. };
  174.  
  175. void()    wiz_stand1    =[    $hover1,        wiz_stand2    ] {ai_stand();};
  176. void()    wiz_stand2    =[    $hover2,        wiz_stand3    ] {ai_stand();};
  177. void()    wiz_stand3    =[    $hover3,        wiz_stand4    ] {ai_stand();};
  178. void()    wiz_stand4    =[    $hover4,        wiz_stand5    ] {ai_stand();};
  179. void()    wiz_stand5    =[    $hover5,        wiz_stand6    ] {ai_stand();};
  180. void()    wiz_stand6    =[    $hover6,        wiz_stand7    ] {ai_stand();};
  181. void()    wiz_stand7    =[    $hover7,        wiz_stand8    ] {ai_stand();};
  182. void()    wiz_stand8    =[    $hover8,        wiz_stand1    ] {ai_stand();};
  183.  
  184. void()    wiz_walk1    =[    $hover1,        wiz_walk2    ] {ai_walk(8);
  185. Wiz_idlesound();};
  186. void()    wiz_walk2    =[    $hover2,        wiz_walk3    ] {ai_walk(8);};
  187. void()    wiz_walk3    =[    $hover3,        wiz_walk4    ] {ai_walk(8);};
  188. void()    wiz_walk4    =[    $hover4,        wiz_walk5    ] {ai_walk(8);};
  189. void()    wiz_walk5    =[    $hover5,        wiz_walk6    ] {ai_walk(8);};
  190. void()    wiz_walk6    =[    $hover6,        wiz_walk7    ] {ai_walk(8);};
  191. void()    wiz_walk7    =[    $hover7,        wiz_walk8    ] {ai_walk(8);};
  192. void()    wiz_walk8    =[    $hover8,        wiz_walk1    ] {ai_walk(8);};
  193.  
  194. void()    wiz_side1    =[    $hover1,        wiz_side2    ] {ai_run(8);
  195. Wiz_idlesound();};
  196. void()    wiz_side2    =[    $hover2,        wiz_side3    ] {ai_run(8);};
  197. void()    wiz_side3    =[    $hover3,        wiz_side4    ] {ai_run(8);};
  198. void()    wiz_side4    =[    $hover4,        wiz_side5    ] {ai_run(8);};
  199. void()    wiz_side5    =[    $hover5,        wiz_side6    ] {ai_run(8);};
  200. void()    wiz_side6    =[    $hover6,        wiz_side7    ] {ai_run(8);};
  201. void()    wiz_side7    =[    $hover7,        wiz_side8    ] {ai_run(8);};
  202. void()    wiz_side8    =[    $hover8,        wiz_side1    ] {ai_run(8);};
  203.  
  204. void()    wiz_run1    =[    $fly1,        wiz_run2    ] {ai_run(16);
  205. Wiz_idlesound();
  206. };
  207. void()    wiz_run2    =[    $fly2,        wiz_run3    ] {ai_run(16);};
  208. void()    wiz_run3    =[    $fly3,        wiz_run4    ] {ai_run(16);};
  209. void()    wiz_run4    =[    $fly4,        wiz_run5    ] {ai_run(16);};
  210. void()    wiz_run5    =[    $fly5,        wiz_run6    ] {ai_run(16);};
  211. void()    wiz_run6    =[    $fly6,        wiz_run7    ] {ai_run(16);};
  212. void()    wiz_run7    =[    $fly7,        wiz_run8    ] {ai_run(16);};
  213. void()    wiz_run8    =[    $fly8,        wiz_run9    ] {ai_run(16);};
  214. void()    wiz_run9    =[    $fly9,        wiz_run10    ] {ai_run(16);};
  215. void()    wiz_run10    =[    $fly10,        wiz_run11    ] {ai_run(16);};
  216. void()    wiz_run11    =[    $fly11,        wiz_run12    ] {ai_run(16);};
  217. void()    wiz_run12    =[    $fly12,        wiz_run13    ] {ai_run(16);};
  218. void()    wiz_run13    =[    $fly13,        wiz_run14    ] {ai_run(16);};
  219. void()    wiz_run14    =[    $fly14,        wiz_run1    ] {ai_run(16);};
  220.  
  221. void()    wiz_fast1    =[    $magatt1,        wiz_fast2    ] {ai_face();Wiz_StartFast();};
  222. void()    wiz_fast2    =[    $magatt2,        wiz_fast3    ] {ai_face();};
  223. void()    wiz_fast3    =[    $magatt3,        wiz_fast4    ] {ai_face();};
  224. void()    wiz_fast4    =[    $magatt4,        wiz_fast5    ] {ai_face();};
  225. void()    wiz_fast5    =[    $magatt5,        wiz_fast6    ] {ai_face();};
  226. void()    wiz_fast6    =[    $magatt6,        wiz_fast7    ] {ai_face();};
  227. void()    wiz_fast7    =[    $magatt5,        wiz_fast8    ] {ai_face();};
  228. void()    wiz_fast8    =[    $magatt4,        wiz_fast9    ] {ai_face();};
  229. void()    wiz_fast9    =[    $magatt3,        wiz_fast10    ] {ai_face();};
  230. void()    wiz_fast10    =[    $magatt2,        wiz_run1    ] {ai_face();SUB_AttackFinished(2);WizardAttackFinished ();};
  231.  
  232. void()    wiz_pain1    =[    $pain1,        wiz_pain2    ] {};
  233. void()    wiz_pain2    =[    $pain2,        wiz_pain3    ] {};
  234. void()    wiz_pain3    =[    $pain3,        wiz_pain4    ] {};
  235. void()    wiz_pain4    =[    $pain4,        wiz_run1    ] {};
  236.  
  237. void()    wiz_death1    =[    $death1,        wiz_death2    ] {
  238.  
  239. self.velocity_x = -200 + 400*random();
  240. self.velocity_y = -200 + 400*random();
  241. self.velocity_z = 100 + 100*random();
  242. self.flags = self.flags - (self.flags & FL_ONGROUND);
  243. sound (self, CHAN_VOICE, "wizard/wdeath.wav", 1, ATTN_NORM);
  244. };
  245. void()    wiz_death2    =[    $death2,        wiz_death3    ] {};
  246. void()  wiz_death3      =[      $death3,                wiz_death4      ]{};
  247. void()    wiz_death4    =[    $death4,        wiz_death5    ] {};
  248. void()    wiz_death5    =[    $death5,        wiz_death6    ] {};
  249. void()    wiz_death6    =[    $death6,        wiz_death7    ] {};
  250. void()    wiz_death7    =[    $death7,        wiz_death8    ] {};
  251. void()  wiz_death8      =[      $death8,                wiz_death8      ] {MakeSolidCorpse ("progs/h_wizard.mdl",self.classname);};
  252.  
  253. void() wiz_die =
  254. {
  255. // check for gib
  256.     if (self.health < -40)
  257.     {
  258.         self.enemy.exp = self.enemy.exp + (27 - self.health)*skill;
  259.         self.netname = "progs/h_wizard.mdl";
  260.         CorpseDie();
  261.         return;
  262.     }
  263.  
  264.     wiz_death1 ();
  265. };
  266.  
  267.  
  268. void(entity attacker, float damage) Wiz_Pain =
  269. {
  270.     sound (self, CHAN_VOICE, "wizard/wpain.wav", 1, ATTN_NORM);
  271.     if (random()*70 > damage)
  272.         return;        // didn't flinch
  273.  
  274.     wiz_pain1 ();
  275. };
  276.  
  277.  
  278. void() Wiz_Missile =
  279. {
  280.         if (self.silencetime > time)
  281.                 return;
  282.     wiz_fast1();
  283. };
  284.  
  285. /*QUAKED monster_wizard (1 0 0) (-16 -16 -24) (16 16 40) Ambush
  286. */
  287. void() monster_wizard =
  288. {
  289.         if ((!self.charmed)&&(deathmatch))
  290.     {
  291.         remove(self);
  292.         return;
  293.     }
  294.     self.solid = SOLID_SLIDEBOX;
  295.     self.movetype = MOVETYPE_STEP;
  296.  
  297.     setmodel (self, "progs/wizard.mdl");
  298.  
  299.     setsize (self, '-16 -16 -24', '16 16 40');
  300.     self.health = 80;
  301.         self.alive = TRUE;
  302.         self.classname ="scrag";
  303.  
  304.     self.th_stand = wiz_stand1;
  305.     self.th_walk = wiz_walk1;
  306.     self.th_run = wiz_run1;
  307.     self.th_missile = Wiz_Missile;
  308.     self.th_pain = Wiz_Pain;
  309.     self.th_die = wiz_die;
  310.         self.initthink = monster_wizard;
  311.         self.active = 3;
  312.  
  313.     flymonster_start ();
  314. };
  315.